/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * FrameBase.java
 *
 * Created on 01/06/2012, 21:53:34
 */
package geradorImagens;

import imagemBmp.FormatoBmp;
import imagemYUV.novoFormato;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;
import utilitarios.Compressao;
import utilitarios.Conversoes;
import utilitarios.Filtros;
import utilitarios.Histograma;

/**
 *
 * @author jeferson
 */
public class FrameBase extends javax.swing.JFrame {

    public static BufferedImage imagem;
    private FormatoBmp formatoBmp;
    novoFormato formatoComprimido;
    novoFormato novoformato;
    public static BufferedImage histograma;
    private boolean yuv;

    /**
     * Creates new form FrameBase
     */
    public FrameBase() {
        this.formatoBmp = null;
        this.yuv = false;
        this.setPreferredSize(new Dimension(800, 600));
        initComponents();
        setLocationRelativeTo(null);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jToolBar1 = new javax.swing.JToolBar();
        jbSalvarComo = new javax.swing.JButton();
        jbSalvar = new javax.swing.JButton();
        jbAbrirImagem = new javax.swing.JButton();
        jbSair = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jpPainelDesenho = new geradorImagens.PainelDesenho();
        jMenuBar1 = new javax.swing.JMenuBar();
        jmImagem = new javax.swing.JMenu();
        jmAbrirImagem = new javax.swing.JMenuItem();
        jmSairSistema = new javax.swing.JMenuItem();
        jmSalvarComo = new javax.swing.JMenuItem();
        jmSalvar = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        jmComprimir = new javax.swing.JMenuItem();
        jmPassaBaixa = new javax.swing.JMenuItem();
        jmPassaAlta = new javax.swing.JMenuItem();
        jmTonsCinza = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jToolBar1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jToolBar1.setRollover(true);

        jbSalvarComo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icones/salvar como.png"))); // NOI18N
        jbSalvarComo.setFocusable(false);
        jbSalvarComo.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbSalvarComo.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbSalvarComo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbSalvarComoActionPerformed(evt);
            }
        });
        jToolBar1.add(jbSalvarComo);

        jbSalvar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icones/1338820263_filesave.png"))); // NOI18N
        jbSalvar.setFocusable(false);
        jbSalvar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbSalvar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbSalvar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbSalvarActionPerformed(evt);
            }
        });
        jToolBar1.add(jbSalvar);

        jbAbrirImagem.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icones/imagem.png"))); // NOI18N
        jbAbrirImagem.setFocusable(false);
        jbAbrirImagem.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbAbrirImagem.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbAbrirImagem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbAbrirImagemActionPerformed(evt);
            }
        });
        jToolBar1.add(jbAbrirImagem);

        jbSair.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icones/sair.png"))); // NOI18N
        jbSair.setFocusable(false);
        jbSair.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jbSair.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jbSair.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbSairActionPerformed(evt);
            }
        });
        jToolBar1.add(jbSair);

        jScrollPane1.setViewportView(jpPainelDesenho);

        jmImagem.setText("Arquivo");

        jmAbrirImagem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_I, java.awt.event.InputEvent.CTRL_MASK));
        jmAbrirImagem.setText("Abrir imagem");
        jmAbrirImagem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmAbrirImagemActionPerformed(evt);
            }
        });
        jmImagem.add(jmAbrirImagem);

        jmSairSistema.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F4, java.awt.event.InputEvent.ALT_MASK));
        jmSairSistema.setText("Sair");
        jmSairSistema.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmSairSistemaActionPerformed(evt);
            }
        });
        jmImagem.add(jmSairSistema);

        jmSalvarComo.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.SHIFT_MASK));
        jmSalvarComo.setText("Salvar como");
        jmSalvarComo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmSalvarComoActionPerformed(evt);
            }
        });
        jmImagem.add(jmSalvarComo);

        jmSalvar.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
        jmSalvar.setText("Salvar");
        jmSalvar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmSalvarActionPerformed(evt);
            }
        });
        jmImagem.add(jmSalvar);

        jMenuBar1.add(jmImagem);

        jMenu2.setText("Editar");

        jmComprimir.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Y, java.awt.event.InputEvent.CTRL_MASK));
        jmComprimir.setText("Comprimir imagem (yuv)");
        jmComprimir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmComprimirActionPerformed(evt);
            }
        });
        jMenu2.add(jmComprimir);

        jmPassaBaixa.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_B, java.awt.event.InputEvent.ALT_MASK));
        jmPassaBaixa.setText("Passa baixa");
        jmPassaBaixa.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmPassaBaixaActionPerformed(evt);
            }
        });
        jMenu2.add(jmPassaBaixa);

        jmPassaAlta.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A, java.awt.event.InputEvent.ALT_MASK));
        jmPassaAlta.setText("Passa alta");
        jmPassaAlta.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmPassaAltaActionPerformed(evt);
            }
        });
        jMenu2.add(jmPassaAlta);

        jmTonsCinza.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_E, java.awt.event.InputEvent.CTRL_MASK));
        jmTonsCinza.setText("Tons de cinza");
        jmTonsCinza.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmTonsCinzaActionPerformed(evt);
            }
        });
        jMenu2.add(jmTonsCinza);

        jMenuBar1.add(jMenu2);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jToolBar1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 542, Short.MAX_VALUE)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 542, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 419, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

private void jmSairSistemaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmSairSistemaActionPerformed
    System.exit(1);
}//GEN-LAST:event_jmSairSistemaActionPerformed

private void jmSalvarComoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmSalvarComoActionPerformed
    this.salvarComo();
}//GEN-LAST:event_jmSalvarComoActionPerformed

private void jmSalvarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmSalvarActionPerformed
    this.salvar();
}//GEN-LAST:event_jmSalvarActionPerformed

private void jmAbrirImagemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmAbrirImagemActionPerformed
    this.abrirImagem();
}//GEN-LAST:event_jmAbrirImagemActionPerformed

private void jbSalvarComoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbSalvarComoActionPerformed
    this.salvarComo();
}//GEN-LAST:event_jbSalvarComoActionPerformed

private void jbSalvarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbSalvarActionPerformed
    this.salvar();
}//GEN-LAST:event_jbSalvarActionPerformed

private void jbAbrirImagemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbAbrirImagemActionPerformed
    this.abrirImagem();
}//GEN-LAST:event_jbAbrirImagemActionPerformed

private void jbSairActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbSairActionPerformed
    System.exit(1);
}//GEN-LAST:event_jbSairActionPerformed

    private void jmComprimirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmComprimirActionPerformed
        try {
            // primeiro passo rgb para YUV 

            novoformato = Conversoes.rgb2yuv(formatoBmp);
        } catch (IOException ex) {
            Logger.getLogger(FrameBase.class.getName()).log(Level.SEVERE, null, ex);
        }
        formatoComprimido = Compressao.comprimi(novoformato);
        this.yuv = true;

        Conversoes novo = new Conversoes();
        byte[] imagemDestruida;
        imagemDestruida = novo.vetorSalvar(this.formatoComprimido, this.yuv, false);
        this.novoformato = CriarNovoFormato.reconstruirImagem(imagemDestruida);
//            this.novoformato = CriarNovoFormato.construirFormato(arquivo);

        int largura = Conversoes.byteArray2Int4(novoformato.largura);
        int altura = Conversoes.byteArray2Int4(novoformato.altura);
        //Criar um bufferImage com o tamanho da imagem e o tipo que do buffer
        FrameBase.imagem = new BufferedImage(largura, altura, BufferedImage.TYPE_INT_ARGB);

        //desenha a imagem no buffer para depois pintar o buffer no painel    
        ImagemBuffer bufferImage = new ImagemBuffer();
//            imagem = bufferImage.definirImagem(imagem, formatoBmp);
        imagem = bufferImage.definirImagem(imagem, novoformato, false);

        //seta o tamanho do painel e a partir do paintComponet ele pinta
        Dimension tamImagem = new Dimension(largura, altura);
        jpPainelDesenho.setPreferredSize(tamImagem);
        jpPainelDesenho.setSize(tamImagem);
        jpPainelDesenho.repaint();
    }//GEN-LAST:event_jmComprimirActionPerformed

private void jmTonsCinzaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmTonsCinzaActionPerformed
//    if (novoformato == null) {
//        JOptionPane.showMessageDialog(null, "A imagem deve ser comprimida antes ser convertida em tons de cinza");
//    } else {
//        novoformato.ConverterCinza();
//        int largura = Conversoes.byteArray2Int4(novoformato.largura);
//        int altura = Conversoes.byteArray2Int4(novoformato.altura);
//        //Criar um bufferImage com o tamanho da imagem e o tipo que do buffer
//        FrameBase.imagem = new BufferedImage(largura, altura, BufferedImage.TYPE_INT_ARGB);
//
//        //desenha a imagem no buffer para depois pintar o buffer no painel    
//        ImagemBuffer bufferImage = new ImagemBuffer();
////            imagem = bufferImage.definirImagem(imagem, formatoBmp);
//        imagem = bufferImage.definirImagem(imagem, novoformato, true);
//
//        //seta o tamanho do painel e a partir do paintComponet ele pinta
//        Dimension tamImagem = new Dimension(largura, altura);
//        jpPainelDesenho.setPreferredSize(tamImagem);
//        jpPainelDesenho.setSize(tamImagem);
//        jpPainelDesenho.repaint();
//    }

    if (yuv == true) {
        JOptionPane.showMessageDialog(null, "Não é possivel realizar operação em formato YUV");
    } else {
        formatoBmp.imagem = formatoBmp.converterCinza24Bit(formatoBmp);
        int largura = formatoBmp.getBiWidth();
        int altura = formatoBmp.getBiHeight();
        //Criar um bufferImage com o tamanho da imagem e o tipo que do buffer
        FrameBase.imagem = new BufferedImage(largura, altura, BufferedImage.TYPE_INT_ARGB);

        //desenha a imagem no buffer para depois pintar o buffer no painel    
        ImagemBuffer bufferImage = new ImagemBuffer();
//            imagem = bufferImage.definirImagem(imagem, formatoBmp);
        imagem = bufferImage.definirImagem(imagem, formatoBmp);

        //seta o tamanho do painel e a partir do paintComponet ele pinta
        Dimension tamImagem = new Dimension(largura, altura);
        jpPainelDesenho.setPreferredSize(tamImagem);
        jpPainelDesenho.setSize(tamImagem);
        jpPainelDesenho.repaint();
        
        
    }
}//GEN-LAST:event_jmTonsCinzaActionPerformed

    private void jmPassaBaixaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmPassaBaixaActionPerformed
        if (yuv == true) {
            JOptionPane.showMessageDialog(null, "Não é possivel realizar operação em formato YUV");
        } else {
            Filtros passaBaixa = new Filtros();
            int altura = Conversoes.byteArray2Int4(formatoBmp.BiHeight);
            int largura = Conversoes.byteArray2Int4(formatoBmp.BiWidth);

//        Conversoes novo = new Conversoes();
//        byte[] imagemDestruida;
//        imagemDestruida = novo.vetorSalvar(this.novoformato, this.yuv, false);
//        novoFormato passadaBaixa = CriarNo    voFormato.reconstruirImagem(imagemDestruida);
            int[][] auxMatrizPassaBaixa = new int[altura][largura * 3];
            int cont = 0;
            for (int i = 0; i < altura; i++) {
                for (int j = 0; j < largura * 3; j++) {
                    auxMatrizPassaBaixa[i][j] = (formatoBmp.imagem[cont] & 0xFF);
                    cont++;
                }

            }
//        int[][] auxMatrizPassaBaixaRGB = new int[altura][largura * 3];
//
//
//        for (int i = 0; i < altura; i++) {
//            for (int j = 0; j < largura * 3; j += 3) {
//
//                int Y = auxMatrizPassaBaixa[i][j];
//                int U = auxMatrizPassaBaixa[i][j + 1];
//                int V = auxMatrizPassaBaixa[i][j + 2];
//
//                int R = (int) (1.164 * (Y - 16) + 2.018 * (U - 128));
//                int G = (int) (1.164 * (Y - 16) - 0.813 * (V - 128) - 0.391 * (U - 128));
//                int B = (int) (1.164 * (Y - 16) + 1.596 * (V - 128));
//
//                if (R > 255) {
//                    R = 255;
//                }
//                if (G > 255) {
//                    G = 255;
//                }
//                if (B > 255) {
//                    B = 255;
//                }
//                if (R < 0) {
//                    R = 0;
//                }
//                if (G < 0) {
//                    G = 0;
//                }
//                if (B < 0) {
//                    B = 0;
//                }
//                auxMatrizPassaBaixaRGB[i][j] = R;
//                auxMatrizPassaBaixaRGB[i][j + 1] = G;
//                auxMatrizPassaBaixaRGB[i][j + 2] = B;
//            }
//        }
//


            passaBaixa.passaBaixa(auxMatrizPassaBaixa, altura, largura);


            cont = 0;
            for (int i = 0; i < altura; i++) {
                for (int j = 0; j < largura * 3; j++) {
                    formatoBmp.imagem[cont] = (byte) passaBaixa.retornoBaixa[i][j];
                    cont++;
                }
            }
//        novoformato.ConverterCinza();

            FrameBase.imagem = new BufferedImage(largura, altura, BufferedImage.TYPE_INT_ARGB);

            //desenha a imagem no buffer para depois pintar o buffer no painel    
            ImagemBuffer bufferImage = new ImagemBuffer();
//            imagem = bufferImage.definirImagem(imagem, formatoBmp);
            imagem = bufferImage.definirImagem(imagem, formatoBmp);

            //seta o tamanho do painel e a partir do paintComponet ele pinta
            Dimension tamImagem = new Dimension(largura, altura);
            jpPainelDesenho.setPreferredSize(tamImagem);
            jpPainelDesenho.setSize(tamImagem);
            jpPainelDesenho.repaint();


        }
    }//GEN-LAST:event_jmPassaBaixaActionPerformed

    private void jmPassaAltaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmPassaAltaActionPerformed
        if (yuv == true) {
            JOptionPane.showMessageDialog(null, "Não é possivel realizar operação em formato YUV");
        } else {
            Filtros passaAlta = new Filtros();
            int altura = Conversoes.byteArray2Int4(formatoBmp.BiHeight);
            int largura = Conversoes.byteArray2Int4(formatoBmp.BiWidth);

//        Conversoes novo = new Conversoes();
//        byte[] imagemDestruida;
//        imagemDestruida = novo.vetorSalvar(this.novoformato, this.yuv, false);
//        novoFormato passadaBaixa = CriarNo    voFormato.reconstruirImagem(imagemDestruida);
            int[][] auxMatrizPassaAlta = new int[altura][largura * 3];
            int cont = 0;
            for (int i = 0; i < altura; i++) {
                for (int j = 0; j < largura * 3; j++) {
                    auxMatrizPassaAlta[i][j] = (formatoBmp.imagem[cont] & 0xFF);
                    cont++;
                }

            }
//        int[][] auxMatrizPassaBaixaRGB = new int[altura][largura * 3];
//
//
//        for (int i = 0; i < altura; i++) {
//            for (int j = 0; j < largura * 3; j += 3) {
//
//                int Y = auxMatrizPassaBaixa[i][j];
//                int U = auxMatrizPassaBaixa[i][j + 1];
//                int V = auxMatrizPassaBaixa[i][j + 2];
//
//                int R = (int) (1.164 * (Y - 16) + 2.018 * (U - 128));
//                int G = (int) (1.164 * (Y - 16) - 0.813 * (V - 128) - 0.391 * (U - 128));
//                int B = (int) (1.164 * (Y - 16) + 1.596 * (V - 128));
//
//                if (R > 255) {
//                    R = 255;
//                }
//                if (G > 255) {
//                    G = 255;
//                }
//                if (B > 255) {
//                    B = 255;
//                }
//                if (R < 0) {
//                    R = 0;
//                }
//                if (G < 0) {
//                    G = 0;
//                }
//                if (B < 0) {
//                    B = 0;
//                }
//                auxMatrizPassaBaixaRGB[i][j] = R;
//                auxMatrizPassaBaixaRGB[i][j + 1] = G;
//                auxMatrizPassaBaixaRGB[i][j + 2] = B;
//            }
//        }
//


            passaAlta.passaAlta(auxMatrizPassaAlta, altura, largura);


            cont = 0;
            for (int i = 0; i < altura; i++) {
                for (int j = 0; j < largura * 3; j++) {
                    formatoBmp.imagem[cont] = (byte) passaAlta.retornoAlta[i][j];
                    cont++;
                }
            }
//        novoformato.ConverterCinza();
            formatoBmp.imagem = formatoBmp.converterCinza24Bit(formatoBmp);
            FrameBase.imagem = new BufferedImage(largura, altura, BufferedImage.TYPE_INT_ARGB);

            //desenha a imagem no buffer para depois pintar o buffer no painel    
            ImagemBuffer bufferImage = new ImagemBuffer();
//            imagem = bufferImage.definirImagem(imagem, formatoBmp);
            imagem = bufferImage.definirImagem(imagem, formatoBmp);

            //seta o tamanho do painel e a partir do paintComponet ele pinta
            Dimension tamImagem = new Dimension(largura, altura);
            jpPainelDesenho.setPreferredSize(tamImagem);
            jpPainelDesenho.setSize(tamImagem);
            jpPainelDesenho.repaint();
        }
    }//GEN-LAST:event_jmPassaAltaActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(FrameBase.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(FrameBase.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(FrameBase.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(FrameBase.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new FrameBase().setVisible(true);
            }
        });
    }

    public void run() {
        this.setVisible(true);
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JButton jbAbrirImagem;
    private javax.swing.JButton jbSair;
    private javax.swing.JButton jbSalvar;
    private javax.swing.JButton jbSalvarComo;
    private javax.swing.JMenuItem jmAbrirImagem;
    private javax.swing.JMenuItem jmComprimir;
    private javax.swing.JMenu jmImagem;
    private javax.swing.JMenuItem jmPassaAlta;
    private javax.swing.JMenuItem jmPassaBaixa;
    private javax.swing.JMenuItem jmSairSistema;
    private javax.swing.JMenuItem jmSalvar;
    private javax.swing.JMenuItem jmSalvarComo;
    private javax.swing.JMenuItem jmTonsCinza;
    private geradorImagens.PainelDesenho jpPainelDesenho;
    // End of variables declaration//GEN-END:variables

    public void salvar() {
        if (formatoBmp != null) {
            File arquivo = CriarBmp.caminho;
            String caminho = arquivo.getAbsolutePath();

            System.out.println(caminho);

            FileOutputStream out;
            try {
                out = new FileOutputStream(caminho);
                Conversoes novo = new Conversoes();
                out.write(novo.vetorSalvar(this.formatoBmp, this.yuv));
                out.flush();
                out.close();
                JOptionPane.showMessageDialog(null, "Imagem salva com sucesso");
            } catch (IOException ex) {
                Logger.getLogger(FrameBase.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {
            JOptionPane.showMessageDialog(null, "Não existe nenhuma imagem aberta para ser salva");
        }
    }

    public void salvarComo() {

        if (formatoBmp != null) {
            JFileChooser fileChooser = new JFileChooser();
            FileNameExtensionFilter filter;
            if (yuv == false) {
                filter = new FileNameExtensionFilter(".bmp", "bmp");
            } else {
                filter = new FileNameExtensionFilter(".yuv", "yuv");
            }

            fileChooser.setFileFilter(filter);
            int option = fileChooser.showSaveDialog(null);
            if (option == JFileChooser.APPROVE_OPTION) {
                File file = fileChooser.getSelectedFile();
                String nome;
                boolean formBMP;
                if (yuv == false) {
                    nome = (file.getName() + ".bmp");
                    formBMP = true;
                } else {
                    nome = (file.getName() + ".yuv");
                    formBMP = false;
                }
                String caminho = fileChooser.getCurrentDirectory().getAbsolutePath();

                System.out.println(caminho);
                System.out.println(nome);

                if (formBMP == true) {
                    boolean existe = verificaArquivo(new File(caminho), nome);

                    if (existe == true) {
                        int conf = JOptionPane.showConfirmDialog(null, "arquivo já existe: Deseja substitui-lo?");
                        if (conf == 0) {//quer substituir  
                            FileOutputStream out;
                            try {
                                out = new FileOutputStream(caminho + File.separator + nome);
                                Conversoes novo = new Conversoes();
                                out.write(novo.vetorSalvar(this.formatoBmp, formBMP));
                                out.flush();
                                out.close();
                                JOptionPane.showMessageDialog(null, "Imagem salva com sucesso");
                            } catch (IOException ex) {
                                Logger.getLogger(FrameBase.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    } else {
                        FileOutputStream out;
                        try {
                            out = new FileOutputStream(caminho + File.separator + nome);
                            Conversoes novo = new Conversoes();
                            out.write(novo.vetorSalvar(this.formatoBmp, formBMP));
                            out.flush();
                            out.close();
                            JOptionPane.showMessageDialog(null, "Imagem salva com sucesso");
                        } catch (IOException ex) {
                            Logger.getLogger(FrameBase.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                } else {
                    boolean existe = verificaArquivo(new File(caminho), nome);

                    if (existe == true) {
                        int conf = JOptionPane.showConfirmDialog(null, "arquivo já existe: Deseja substitui-lo?");
                        if (conf == 0) {//quer substituir  
                            FileOutputStream out;
                            try {
                                out = new FileOutputStream(caminho + File.separator + nome);
                                Conversoes novo = new Conversoes();
                                out.write(novo.vetorSalvar(this.formatoComprimido, this.yuv, true));
                                out.flush();
                                out.close();
                                JOptionPane.showMessageDialog(null, "Imagem salva com sucesso");
                            } catch (IOException ex) {
                                Logger.getLogger(FrameBase.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    } else {
                        FileOutputStream out;
                        try {
                            out = new FileOutputStream(caminho + File.separator + nome);
                            Conversoes novo = new Conversoes();
                            out.write(novo.vetorSalvar(this.formatoComprimido, this.yuv, true));
                            out.flush();
                            out.close();
                            JOptionPane.showMessageDialog(null, "Imagem salva com sucesso");
                        } catch (IOException ex) {
                            Logger.getLogger(FrameBase.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }
            }
        } else {
            JOptionPane.showMessageDialog(null, "Não existe nenhuma imagem aberta para ser salva");
        }
    }

    public void abrirImagem() {
        String caminho;
        boolean arquivoFerrou = false;
        JFileChooser j = new JFileChooser();
        j.setDialogType(JFileChooser.OPEN_DIALOG);

        j.setDialogTitle("Abrir Arquivo");
        j.setCurrentDirectory(new File("d:/Netbeans/SimuladorGerenciamentoMemoria/tracer/"));
        int res = j.showOpenDialog(null);

        if (res == JFileChooser.APPROVE_OPTION) {
            caminho = j.getSelectedFile().getAbsolutePath();
        } else {
            caminho = "";
        }

        String p[] = caminho.split("\\.");

        //arquivo não é bmp
        if ((!"bmp".equals(p[p.length - 1])) && (!"yuv".equals(p[p.length - 1]))) {
            JOptionPane.showMessageDialog(null, "arquivo fora de formato");
            arquivoFerrou = true;
        } //arquivo invalido
        else if ("".equals(caminho)) {
            JOptionPane.showMessageDialog(null, "erro ao abrir o arquivo solicitado");
            arquivoFerrou = true;
        } //arquivo correto gera a imagem para exibição
        else if (arquivoFerrou == false) {
            File arquivo = new File(caminho);
            if (p[p.length - 1].equals("bmp")) {
                if(yuv == true){
                    yuv = false;
                }
                this.formatoBmp = CriarBmp.construirBmp(arquivo);
//            this.novoformato = CriarNovoFormato.construirFormato(arquivo);

                int largura = Conversoes.byteArray2Int4(formatoBmp.BiWidth);
                int altura = Conversoes.byteArray2Int4(formatoBmp.BiHeight);
                //Criar um bufferImage com o tamanho da imagem e o tipo que do buffer
                FrameBase.imagem = new BufferedImage(largura, altura, BufferedImage.TYPE_INT_ARGB);

                //desenha a imagem no buffer para depois pintar o buffer no painel    
                ImagemBuffer bufferImage = new ImagemBuffer();
//            imagem = bufferImage.definirImagem(imagem, formatoBmp);
                imagem = bufferImage.definirImagem(imagem, formatoBmp);

                //seta o tamanho do painel e a partir do paintComponet ele pinta
                Dimension tamImagem = new Dimension(largura, altura);
                jpPainelDesenho.setPreferredSize(tamImagem);
                jpPainelDesenho.setSize(tamImagem);
                jpPainelDesenho.repaint();
            } else if (p[p.length - 1].equals("yuv")) {
                if(yuv == false){
                    yuv = true;
                }
                this.novoformato = CriarNovoFormato.construirFormato(arquivo);
//            this.novoformato = CriarNovoFormato.construirFormato(arquivo);

                int largura = Conversoes.byteArray2Int4(novoformato.largura);
                int altura = Conversoes.byteArray2Int4(novoformato.altura);
                //Criar um bufferImage com o tamanho da imagem e o tipo que do buffer
                FrameBase.imagem = new BufferedImage(largura, altura, BufferedImage.TYPE_INT_ARGB);

                //desenha a imagem no buffer para depois pintar o buffer no painel    
                ImagemBuffer bufferImage = new ImagemBuffer();
//            imagem = bufferImage.definirImagem(imagem, formatoBmp);
                imagem = bufferImage.definirImagem(imagem, novoformato, false);

                //seta o tamanho do painel e a partir do paintComponet ele pinta
                Dimension tamImagem = new Dimension(largura, altura);
                jpPainelDesenho.setPreferredSize(tamImagem);
                jpPainelDesenho.setSize(tamImagem);
                jpPainelDesenho.repaint();
            }
        }
    }

    public boolean verificaArquivo(File diretorio, String arquivo) {
        boolean existeArquivo = false;
        File[] listaArquivos = diretorio.listFiles();

        if (listaArquivos != null) {
            for (int i = 0; i < listaArquivos.length; i++) {
                String caminho = listaArquivos[i].getAbsolutePath();
                String p[] = caminho.split("\\\\");
                if (p[p.length - 1].equals(arquivo)) {
                    return existeArquivo = true;
                }
            }
        }
        return existeArquivo;
    }
}
